//用模板的思想实现
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;



template<typename T1>
void func(T1 it)
{
	cout << it << ", hello!" << endl;
}

template<typename T1>
class myc
{
public:
	void operator()(T1 it)	//重载()运算符，则可以直接对象名()调用
	{
		cout << it << ", hello!" << endl;
	}
};

template<typename T, typename T2>
//void foreach(const T begin, const T end, void (*pfun) (T2))
	//第三个参数为函数指针，组成为:  函数返回类型 (*指针名)（各参数类型）
void foreach(const T begin, const T end, T2 pfun)	//T2的类型是 void (*pfun) (T1)
{										//T2的类型也可能是myc
	for (auto it = begin; it != end; it++)
	{
		pfun(*it);
	}
}




int main()
{
	//vector<int> v = { 5, 7, 2, 3, 9, 8 };
	vector<string> v = { "05", "06", "07", "03", "09", "08"};
	//需求:遍历容器并实现操作（自定义）
	//法一，函数当参数
	foreach(v.begin(), v.end(), func<string>);	//模板套模板时需要用具体类型实例化模板，这里是func<string>

	//法二，类对象当参数
	myc<string> myclass;
	foreach(v.begin(), v.end(), myc<string>());		//第三个参数是匿名对象也可以是普通对象myclass
										//重载了()的类也叫仿函数
	return 0;
}


//除了for_each()函数，还有 find_if(), sort()函数，实现类似。
